/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hhf.flex.ascreator;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author HHFrancois
 */
public class ASCreatorTools {

    private static ResourceBundle mapping = ResourceBundle.getBundle("mappingJavaAs");

    public static String getASClassName(Class clazz, boolean legacyCollection) {
        if (clazz == null) {
            return null;
        }
        if (clazz.isEnum()) {
            return "String";
        }
        if (Collection.class.isAssignableFrom(clazz)) { // la classe est elle une collection ou héritée de collection
            clazz = Collection.class; // on cherche donc une collection
        }
        String result = null;
        String search = clazz.getName();
        try {
            if (clazz.isArray()) {
                result = "Array";
                search = clazz.getComponentType().getName() + "s";
            }
            result = mapping.getString(search);
            if (result.equals("ArrayCollection") && legacyCollection) {
                result = "Array";
            }
        } catch (MissingResourceException mre) {
            if (!clazz.isArray() && !"void".equals(search)) {
                Logger.getAnonymousLogger().log(Level.FINEST, "Not found native ASMapping for : {0}", search);
            }
        }
        return result;
    }

    /**
     * Récupere les types des arguments.
     * On n'utilise pas discoverClass car ici, on a juste besoin des types directs, pas des type parametrés
     * @param method
     * @return
     */
    protected static List<String> getASArguments(Method method, boolean legacyCollection) {
        List<String> result = new ArrayList<String>();
        Class[] clazzs = method.getParameterTypes();
        for (Class clazz : clazzs) {
            String c = getASType(clazz, legacyCollection);
            if (!c.equals("void")) {
                result.add(c); // ce sont des arguments, cela doit donner quelques chose.
            }
        }
        return result;
    }

    /**
     * Retourne la classe vu par AS, ou le type mappé par BlazeDS ou la classe elle même qui sera créé et importé
     * @param clazz
     * @return
     */
    protected static String getASType(Class clazz, boolean legacyCollection) {
        String returnType = getASClassName(clazz, legacyCollection);
        if (returnType == null) {
            returnType = clazz.getSimpleName();
        }
        return returnType;
    }

    /**
     * Retourne le nom du field à partir d'une methode
     * ne tient compte que des getter
     * getNameColumn => nameColumn
     * setNameColumn => nameColumn
     * isEnabledColumn => enabledColumn
     * @param method
     * @return
     */
    public static String getFieldName(Method method) {
        String fieldName = null;
        if (Modifier.isPublic(method.getModifiers())) {
            String methodName = method.getName();
            if (method.getReturnType().equals(void.class)) {
                return null;
            }
            if (methodName.startsWith("get")) {
                fieldName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
            }
            if (methodName.startsWith("is")) {
                fieldName = methodName.substring(2, 3).toLowerCase() + methodName.substring(3);
            }
        }
        return fieldName;
    }

    public static boolean isSimpleASType(String asType) {
        if (asType.equals("String")) {
            return true;
        }
        if (asType.equals("int")) {
            return true;
        }
        if (asType.equals("Date")) {
            return true;
        }
        if (asType.equals("Boolean")) {
            return true;
        }
        if (asType.equals("Number")) {
            return true;
        }
        if (asType.equals("ByteArray")) {
            return true;
        }
        if (asType.equals("XML")) {
            return true;
        }
        return false;
    }

    public static String getSQLType(String asType) {
        if (asType.equals("String")) {
            return "text";
        }
        if (asType.equals("int")) {
            return "integer";
        }
        if (asType.equals("Date")) {
            return "date";
        }
        if (asType.equals("Boolean")) {
            return "boolean";
        }
        if (asType.equals("Number")) {
            return "real";
        }
        if (asType.equals("ByteArray")) {
            return "blob";
        }
        if (asType.equals("XML")) {
            return "text";
        }
        return null;
    }
}
